home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / MOR55SRC.ZIP / MORIA / SOURCE / SIGNALS.C < prev    next >
C/C++ Source or Header  |  1992-12-07  |  8KB  |  341 lines

  1. /* source/signals.c: signal handlers
  2.  
  3.    Copyright (c) 1989-92 James E. Wilson, Christopher J. Stuart
  4.  
  5.    This software may be copied and distributed for educational, research, and
  6.    not for profit purposes provided that this copyright and statement are
  7.    included in all such copies. */
  8.  
  9. /* This signal package was brought to you by        -JEW-  */
  10. /* Completely rewritten by                -CJS- */
  11.  
  12. /* To find out what system we're on.  */
  13.  
  14. #include <stdio.h>
  15.  
  16. #include "config.h"
  17. #include "constant.h"
  18.  
  19. /* Signals have no significance on the Mac */
  20.  
  21. #ifdef MAC
  22.  
  23. void nosignals()
  24. {
  25. }
  26.  
  27. void signals()
  28. {
  29. }
  30.  
  31. void init_signals()
  32. {
  33. }
  34.  
  35. #else /* a non-Mac system */
  36.  
  37. #ifdef ATARIST_MWC
  38. /* need these for atari st, but for unix, must include signals.h first,
  39.    or else suspend won't be properly declared */
  40. #include "types.h"
  41. #include "externs.h"
  42. #endif
  43.  
  44. /* skip most of the file on an ATARI ST */
  45. /* commented away most single handling for Atari ST TC too, as this
  46.    doesn't work as it should.  */
  47. #if !defined(ATARIST_MWC) && !defined(ATARIST_TC)
  48.  
  49. #if defined(SYS_V) && defined(lint)
  50. /* for AIX, prevent hundreds of unnecessary lint errors, define before
  51.    signal.h is included */
  52. #define _h_IEEETRAP
  53. typedef struct { int stuff; } fpvmach;
  54. #endif
  55.  
  56. /* must include before externs.h, because that uses SIGTSTP */
  57. #include <signal.h>
  58.  
  59. #include "types.h"
  60. #include "externs.h"
  61.  
  62. #ifndef USG
  63. /* only needed for Berkeley UNIX */
  64. #include <sys/types.h>
  65. #include <sys/param.h>
  66. #endif
  67.  
  68. #ifdef USG
  69. #ifndef ATARIST_MWC
  70. #include <string.h>
  71. #endif
  72. #else
  73. #include <strings.h>
  74. #endif
  75.  
  76. #ifndef VMS
  77. #ifdef USG
  78. void exit();
  79. #ifdef __TURBOC__
  80. void sleep();
  81. #else
  82. unsigned sleep();
  83. #endif
  84. #endif
  85. #endif
  86.  
  87. static int error_sig = -1;
  88. static int signal_count = 0;
  89.  
  90. /*ARGSUSED*/
  91. #ifndef USG
  92. static int signal_handler(sig, code, scp)
  93. int sig, code;
  94. struct sigcontext *scp;
  95. {
  96.   int smask;
  97.  
  98.   smask = sigsetmask(0) | (1 << sig);
  99. #else
  100. #if defined(__TURBOC__) || defined(AMIGA)
  101. static void signal_handler(sig)
  102. #else
  103. static int signal_handler(sig)
  104. #endif
  105. int sig;
  106. {
  107. #endif
  108.  
  109.   if(error_sig >= 0)    /* Ignore all second signals. */
  110.     {
  111.       if(++signal_count > 10)    /* Be safe. We will die if persistent enough. */
  112.     (void) signal(sig, SIG_DFL);
  113.       return;
  114.     }
  115.   error_sig = sig;
  116.  
  117.   /* Allow player to think twice. Wizard may force a core dump. */
  118.   if (sig == SIGINT
  119. #if !defined(MSDOS) && !defined(AMIGA) && !defined(ATARIST_TC)
  120.       || sig == SIGQUIT
  121. #endif
  122.       )
  123.     {
  124.       if (death)
  125.     (void) signal(sig, SIG_IGN);        /* Can't quit after death. */
  126.       else if (!character_saved && character_generated)
  127.     {
  128.       if (!get_check("Really commit *Suicide*?"))
  129.         {
  130.           if (turn > 0)
  131.         disturb(1, 0);
  132.           erase_line(0, 0);
  133.           put_qio();
  134.           error_sig = -1;
  135. #ifdef USG
  136.           (void) signal(sig, signal_handler);/* Have to restore handler. */
  137. #else
  138.           (void) sigsetmask(smask);
  139. #endif
  140.           /* in case control-c typed during msg_print */
  141.           if (wait_for_more)
  142.         put_buffer(" -more-", MSG_LINE, 0);
  143.           put_qio();
  144.           return;        /* OK. We don't quit. */
  145.         }
  146.       (void) strcpy(died_from, "Interrupting");
  147.     }
  148.       else
  149.     (void) strcpy(died_from, "Abortion");
  150.       prt("Interrupt!", 0, 0);
  151.       death = TRUE;
  152.       exit_game();
  153.     }
  154.   /* Die. */
  155.   prt(
  156. "OH NO!!!!!!  A gruesome software bug LEAPS out at you. There is NO defense!",
  157.       23, 0);
  158.   if (!death && !character_saved && character_generated)
  159.     {
  160.       panic_save = 1;
  161.       prt("Your guardian angel is trying to save you.", 0, 0);
  162.       (void) sprintf(died_from,"(panic save %d)",sig);
  163.       if (!save_char())
  164.     {
  165.       (void) strcpy(died_from, "software bug");
  166.       death = TRUE;
  167.       turn = -1;
  168.     }
  169.     }
  170.   else
  171.     {
  172.       death = TRUE;
  173.       (void) _save_char(savefile);    /* Quietly save the memory anyway. */
  174.     }
  175.   restore_term();
  176. #if !defined(MSDOS) && !defined(AMIGA) && !defined(ATARIST_TC)
  177.   /* always generate a core dump */
  178.   (void) signal(sig, SIG_DFL);
  179.   (void) kill(getpid(), sig);
  180.   (void) sleep(5);
  181. #endif
  182.   exit(1);
  183. }
  184.  
  185. #endif /* ATARIST_MWC, ATARIST_TC */
  186.  
  187. #ifndef USG
  188. static int mask;
  189. #endif
  190.  
  191. void nosignals()
  192. {
  193. #if !defined(ATARIST_MWC) && !defined(ATARIST_TC)
  194. #ifdef SIGTSTP
  195. #if defined(atarist) && defined(__GNUC__)
  196.   (void) signal(SIGTSTP, (__Sigfunc)SIG_IGN);
  197. #else
  198.   (void) signal(SIGTSTP, SIG_IGN);
  199. #endif
  200. #ifndef USG
  201.   mask = sigsetmask(0);
  202. #endif
  203. #endif
  204.   if (error_sig < 0)
  205.     error_sig = 0;
  206. #endif
  207. }
  208.  
  209. void signals()
  210. {
  211. #if !defined(ATARIST_MWC) && !defined(ATARIST_TC)
  212. #ifdef SIGTSTP
  213. #if defined(atarist) && defined(__GNUC__)
  214.   (void) signal(SIGTSTP, (__Sigfunc)suspend);
  215. #else
  216.   (void) signal(SIGTSTP, suspend);
  217. #endif
  218. #ifndef USG
  219.   (void) sigsetmask(mask);
  220. #endif
  221. #endif
  222.   if (error_sig == 0)
  223.     error_sig = -1;
  224. #endif
  225. }
  226.  
  227.  
  228. void init_signals()
  229. {
  230. #if !defined(ATARIST_MWC) && !defined(ATARIST_TC)
  231.   /* No signals for Atari ST compiled with MWC or TC.  */
  232.   (void) signal(SIGINT, signal_handler);
  233.  
  234. #if defined(atarist) && defined(__GNUC__)
  235.   /* Atari ST compiled with GNUC has most signals, but we need a cast
  236.      in every call to signal.  */
  237.   (void) signal(SIGINT, (__Sigfunc)signal_handler);
  238.   (void) signal(SIGQUIT, (__Sigfunc)signal_handler);
  239.   (void) signal(SIGTSTP,(__Sigfunc)SIG_IGN);
  240.   (void) signal(SIGILL, (__Sigfunc)signal_handler);
  241.   (void) signal(SIGHUP, (__Sigfunc)SIG_IGN);
  242.   (void) signal(SIGTRAP,(__Sigfunc)signal_handler);
  243.   (void) signal(SIGIOT, (__Sigfunc)signal_handler);
  244.   (void) signal(SIGEMT, (__Sigfunc)signal_handler);
  245.   (void) signal(SIGKILL, (__Sigfunc)signal_handler);
  246.   (void) signal(SIGBUS, (__Sigfunc)signal_handler);
  247.   (void) signal(SIGSEGV, (__Sigfunc)signal_handler);
  248.   (void) signal(SIGSYS, (__Sigfunc)signal_handler);
  249.   (void) signal(SIGTERM,(__Sigfunc)signal_handler);
  250.   (void) signal(SIGPIPE, (__Sigfunc)signal_handler);
  251.  
  252. #else
  253.   /* Everybody except the atari st.  */
  254.   (void) signal(SIGINT, signal_handler);
  255.   (void) signal(SIGFPE, signal_handler);
  256.  
  257. #if defined(MSDOS)
  258.   /* many fewer signals under MSDOS */
  259. #else
  260.  
  261. #ifdef AMIGA
  262. /*  (void) signal(SIGINT, signal_handler); */
  263.   (void) signal(SIGTERM, signal_handler);
  264.   (void) signal(SIGABRT, signal_handler);
  265. /*  (void) signal(SIGFPE, signal_handler); */
  266.   (void) signal(SIGILL, signal_handler);
  267.   (void) signal(SIGSEGV, signal_handler);
  268.  
  269. #else
  270.  
  271.   /* Everybody except Atari, MSDOS, and Amiga.  */
  272.   /* Ignore HANGUP, and let the EOF code take care of this case. */
  273.   (void) signal(SIGHUP, SIG_IGN);
  274.   (void) signal(SIGQUIT, signal_handler);
  275.   (void) signal(SIGILL, signal_handler);
  276.   (void) signal(SIGTRAP, signal_handler);
  277.   (void) signal(SIGIOT, signal_handler);
  278. #ifdef SIGEMT  /* in BSD systems */
  279.   (void) signal(SIGEMT, signal_handler);
  280. #endif
  281. #ifdef SIGDANGER /* in SYSV systems */
  282.   (void) signal(SIGDANGER, signal_handler);
  283. #endif
  284.   (void) signal(SIGKILL, signal_handler);
  285.   (void) signal(SIGBUS, signal_handler);
  286.   (void) signal(SIGSEGV, signal_handler);
  287.   (void) signal(SIGSYS, signal_handler);
  288.   (void) signal(SIGTERM, signal_handler);
  289.   (void) signal(SIGPIPE, signal_handler);
  290. #ifdef SIGXCPU    /* BSD */
  291.   (void) signal(SIGXCPU, signal_handler);
  292. #endif
  293. #ifdef SIGPWR /* SYSV */
  294.   (void) signal(SIGPWR, signal_handler);
  295. #endif
  296. #endif
  297. #endif
  298. #endif
  299. #endif
  300. }
  301.  
  302. void ignore_signals()
  303. {
  304. #if !defined(ATARIST_MWC)
  305.   (void) signal(SIGINT, SIG_IGN);
  306. #ifdef SIGQUIT
  307.   (void) signal(SIGQUIT, SIG_IGN);
  308. #endif
  309. #endif
  310. }
  311.  
  312. void default_signals()
  313. {
  314. #if !defined(ATARIST_MWC)
  315.   (void) signal(SIGINT, SIG_DFL);
  316. #ifdef SIGQUIT
  317.   (void) signal(SIGQUIT, SIG_DFL);
  318. #endif
  319. #endif
  320. }
  321.  
  322. void restore_signals()
  323. {
  324. #if !defined(ATARIST_MWC)
  325. #if defined(atarist) && defined(__GNUC__)
  326.   (void) signal(SIGINT, (__Sigfunc)signal_handler);
  327. #else
  328.   (void) signal(SIGINT, signal_handler);
  329. #endif
  330. #ifdef SIGQUIT
  331. #if defined(atarist) && defined(__GNUC__)
  332.   (void) signal(SIGQUIT, (__Sigfunc)signal_handler);
  333. #else
  334.   (void) signal(SIGQUIT, signal_handler);
  335. #endif
  336. #endif
  337. #endif
  338. }
  339.  
  340. #endif /* big Mac conditional */
  341.